﻿<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>ComObjArray()</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link href="../css/default.css" rel="stylesheet" type="text/css">
</head>
<body>

<h1>ComObjArray() <span class="ver">[v1.0.91+]</span></h1>

<p>使用 COM 创建 SafeArray.</p>

<pre class="Syntax">ArrayObj := ComObjArray(VarType, Count1 [, Count2, ... Count8])</pre>

<h3>参数</h3>
<table class="info">
  <tr>
    <td>VarType</td>
    <td>数组的基类型 (数组的每个元素的 VARTYPE).VARTYPE 被限制为变量类型的子集.不能设置为 VT_ARRAY 和 VT_BYREF.对于数组的基类型 VT_EMPTY 和 VT_NULL 都是无效的.所有其他类型都是合法的.
    <p>参见 <a href="ComObjType.htm">ComObjType</a> 了解允许值的列表.</p></td>
  </tr>
  <tr>
    <td>Count<i>N</i></td>
    <td>每个维数的大小.最多可以含有 8 维的数组.</td>
  </tr>
  <tr>
    <td>ArrayObj</td>
    <td>包含 SafeArray 的包装器对象.</td>
  </tr>
</table>

<h3>方法</h3>
<p>数组包装器对象支持下列方法:</p>
<p><code class="Syntax">Array.MaxIndex(n)</code>:返回第 <i>n</i> 维的上界.如果省略, 默认为 <I>1</I>.</p>
<p><code class="Syntax">Array.MinIndex(n)</code>:返回第 <i>n</i> 维的下界.如果省略, 默认为 <I>1</I>.</p>
<p><code class="Syntax">Array.Clone()</code> <span class="ver">[v1.0.96.00+]</span>:返回数组的副本.</p>
<p><code class="Syntax">Array._NewEnum()</code> <span class="ver">[v1.0.96.00+]</span>:通常不是由脚本调用; 允许 <a href="For.htm">for 循环</a> 和 SafeArray 一起使用.</p>

<h3>一般说明</h3>
<p>COM 方法和 <a href="ComObjActive.htm">ComObjActive</a> 也可以返回数组包装器对象.脚本中可以使用如下方法判断一个值是否为数组:</p>
<pre>if ComObjType(<i>obj</i>) &amp; 0x2000
    MsgBox % "Array subtype: " . ComObjType(obj) &amp; 0xfff
else
    MsgBox Not an array.</pre>
<p>可以支持多达 8 维的数组.</p>
<p><span class="ver">[v1.0.96.00+]:</span> 由于 SafeArray 没有设计支持多种引用, 当一个 SafeArray 被赋值为另一个 SafeArray 的元素时, 会创建一个独立的副本.不过, 只有当包装器对象含有 F_OWNVALUE 标志时才会发生这样的情况, 这个标志表示它负责销毁此数组.可以使用 <a href="ComObjFlags.htm">ComObjFlags</a> 移除此标志.</p>

<h3>相关</h3>
<p><a href="ComObjType.htm">ComObjType</a>, <a href="ComObjValue.htm">ComObjValue</a>, <a href="ComObjActive.htm">ComObjActive</a>, <a href="ComObjFlags.htm">ComObjFlags</a>, <a href="http://msdn.microsoft.com/en-us/library/ms221145.aspx">数组操作函数 (MSDN)</a></p>

<h3>示例</h3>
<pre class="NoIndent" id="Ex1"><em>; 示例 #1:简单用法.</em>

arr := ComObjArray(VT_VARIANT:=12, 3)
arr[0] := "Auto"
arr[1] := "Hot"
arr[2] := "key"
Loop % arr.MaxIndex() + 1
   t .= arr[A_Index-1]
MsgBox % t
</pre>

<pre class="NoIndent" id="Ex2"><em>; 示例 #2:多维数组.</em>

arr := ComObjArray(VT_VARIANT:=12, 3, 4)

<em>; 获取数组的维数个数:</em>
dim := DllCall("oleaut32\SafeArrayGetDim", "ptr", ComObjValue(arr))

<em>; 获取每个维数的边界:</em>
Loop %dim%
    dims .= arr.MinIndex(A_Index) " .. " arr.MaxIndex(A_Index) "`n"
MsgBox %dims%

<em>; 简单用法:</em>
Loop 3 {
    x := A_Index-1
    Loop 4 {
        y := A_Index-1
        arr[x, y] := x * y
    }
}
MsgBox % arr[2, 3]
</pre>

</body>
</html>
